package cn.ant.mqHandle;

import cn.ant.config.RabbitMQConfig;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;

/***
 * 简单的生产者
 * @author Anhui AntLaddie <a href="https://juejin.cn/user/4092805620185316">(掘金蚂蚁小哥)</a>
 * @version 1.0
 **/
@Slf4j
@Component
@RequiredArgsConstructor
public class SimpleProducer {

    // 注入RabbitTemplate模板对象（集成RabbitMQ时发送是通过这个对象）
    private final RabbitTemplate rabbitTemplate;

    /***
     * 生产者发送消息的方法
     * @param msg 发送的消息（这里的消息可以是任何类型，最终发送时推荐转成JSON字符串）
     */
    public void productionSimpleMessage(String msg) {
        log.info("生产者接收到任务消息，并发送任务消息到指定交换机中....");
        // 发送消息到Brock的交换机
        // 这一步在日常开发中是有数据处理的逻辑的，校验和转换数据的，最终会转成JSON字符串后发送的
        // 为了简洁，我这里传入的任务消息都是字符串，免去了乱七八糟的流程，直接发送
        byte[] bytes = msg.getBytes(StandardCharsets.UTF_8);
        // convertAndSend("交换机名称","路由key","发送消息内容")，其实和下面原生的是一样的：
        // channel.basicPublish("交换机名称","路由key","其它参数","消息");
        // 使用convertAndSend默认消息是持久化的，就如当初原生设置的其它参数：MessageProperties.PERSISTENT_TEXT_PLAIN
        rabbitTemplate.convertAndSend(
                RabbitMQConfig.SIMPLE_DIRECT_EXCHANGE,
                RabbitMQConfig.SIMPLE_KEY, bytes);
    }
}
